package com.tony.inet;

import javax.persistence.ManyToMany;
import java.io.IOException;
import java.net.*;

/**
 * @version V1.0  </br>
 * @ClassName UDPSendReceive </br>
 * @Description TODO  </br>
 * @Author tonywang</br>
 * @DATE 2/26/2019 1:52 PM</br>
 */
public class UDPSendReceive {
    public static void main(String[] args) throws IOException {
        Send.runUDPSend();
//        Receive.runUDPReceive();
    }
}

class Send{
    public static void runUDPSend() throws IOException {
        System.out.println("UDP发送端启动...");
        //1,建立udp的socket服务。使用DatagramSocket对象。
        DatagramSocket datagramSocket = new DatagramSocket(20100);
        //2,将要发送的数据封装到数据包中。
        String data = "测试数据";
        byte[] bytes = data.getBytes();
        // 使用DatagramPacket将数据封装到的该对象包中。
        // 构造数据报包，用来将长度为 length 的包发送到指定主机上的指定端口号。
        DatagramPacket dp = new DatagramPacket(bytes,bytes.length, InetAddress.getByName("localhost"),20000);
        //3,通过udp的socket服务将数据包发送出去。使用send方法
        datagramSocket.send(dp);
        //4，关闭资源。
        datagramSocket.close();
    }
}

class Receive{
    public static void runUDPReceive() throws IOException {
        System.out.println("UDP接收端启动...");
        // 1,建立udp socket服务。
        DatagramSocket ds = new DatagramSocket(20000);
        // 2,创建数据包。
        while (true){ // 此处循环，模拟服务器
            byte[] buff = new byte[1024];
            DatagramPacket dp = new DatagramPacket(buff,buff.length);
            // 3,使用接收方法将数据存储到数据包中
            ds.receive(dp);
            // 4,通过数据包对象的方法，解析其中的数据,比如，地址，端口，数据内容
            InetAddress address = dp.getAddress();
            int port = dp.getPort();
            String ip = address.getHostAddress();
            // 取出数据并转换为字符串
            byte[] bytes = dp.getData();
            String receiveData = new String(bytes,0,bytes.length);
            System.out.println("IP：" + ip + "\n端口号Port：" + port
                    + "\n接收到的数据receiveData:" + receiveData);
        }
        // 5,关闭资源
        // datagramSocket.close();
    }
}